home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / news / inn1.000 / inn1.4sec-linux-src.tar / inn / lib / remopen.c < prev    next >
C/C++ Source or Header  |  1992-10-19  |  5KB  |  198 lines

  1. /*  $Revision: 1.14 $
  2. **
  3. */
  4. #include <stdio.h>
  5. #include <errno.h>
  6. #include <sys/types.h>
  7. #include <sys/socket.h>
  8. #if    defined(DO_HAVE_UNIX_DOMAIN)
  9. #include <sys/un.h>
  10. #endif    /* defined(DO_HAVE_UNIX_DOMAIN) */
  11. #include <netinet/in.h>
  12. #include <netdb.h>
  13. #include "configdata.h"
  14. #include "nntp.h"
  15. #include "paths.h"
  16. #include "libinn.h"
  17. #include "clibrary.h"
  18.  
  19.  
  20. #if    !defined(ntohs) && !defined(NETSWAP)
  21. extern unsigned short    ntohs();
  22. #endif    /* !defined(ntohs) && !defined(NETSWAP) */
  23.  
  24.  
  25. /*
  26. **  Open a connection to an NNTP server and create stdio FILE's for talking
  27. **  to it.  Return -1 on error.
  28. */
  29. int
  30. NNTPconnect(p, FromServerp, ToServerp, errbuff)
  31.     register char    *p;
  32.     FILE        **FromServerp;
  33.     FILE        **ToServerp;
  34.     char        *errbuff;
  35. {
  36.     char        **ap;
  37.     char        *fakelist[2];
  38.     register char    *dest;
  39.     char        mybuff[NNTP_STRLEN + 2];
  40.     char        *buff;
  41.     register int    i;
  42.     register int    j;
  43.     int            oerrno;
  44.     FILE        *F;
  45.     struct hostent    *hp;
  46.     struct hostent    fakehp;
  47.     struct in_addr    quadaddr;
  48.     struct sockaddr_in    server;
  49.  
  50.     buff = errbuff ? errbuff : mybuff;
  51.     *buff = '\0';
  52.     quadaddr.s_addr = inet_addr(p);
  53.     if (quadaddr.s_addr != (unsigned long)-1) {
  54.     /* Host was specified as a dotted-quad internet address.  Fill in
  55.      * the parts of the hostent struct that we need. */
  56.     fakehp.h_length = sizeof quadaddr;
  57.     fakehp.h_addrtype = AF_INET;
  58.     hp = &fakehp;
  59.     fakelist[0] = (char *)&quadaddr;
  60.     fakelist[1] = NULL;
  61.     ap = fakelist;
  62.     }
  63.     else if ((hp = gethostbyname(p)) != NULL) {
  64.     /* Symbolic host name. */
  65. #if    defined(h_addr)
  66.     ap = hp->h_addr_list;
  67. #else
  68.     /* Fake up an address list for old systems. */
  69.     fakelist[0] = (char *)hp->h_addr;
  70.     fakelist[1] = NULL;
  71.     ap = fakelist;
  72. #endif    /* defined(h_addr) */
  73.     }
  74.     else
  75.     /* Not a host name. */
  76.     return -1;
  77.  
  78.     /* Set up the socket address. */
  79.     (void)memset((POINTER)&server, 0, sizeof server);
  80.     server.sin_family = hp->h_addrtype;
  81.     server.sin_port = ntohs(NNTP_PORT);
  82.  
  83.     /* Loop through the address list, trying to connect. */
  84.     for (; ap && *ap; ap++) {
  85.     /* Make a socket and try to connect. */
  86.     if ((i = socket(hp->h_addrtype, SOCK_STREAM, 0)) < 0)
  87.         break;
  88.     /* Copy the address via inline memcpy:
  89.      *    (void)memcpy((POINTER)&server.sin_addr, (POINTER)*ap,
  90.             (int)hp->h_length); */
  91.     p = (char *)*ap;
  92.     for (dest = (char *)&server.sin_addr, j = hp->h_length; --j >= 0; )
  93.         *dest++ = *p++;
  94.     if (connect(i, (struct sockaddr *)&server, sizeof server) < 0) {
  95.         oerrno = errno;
  96.         (void)close(i);
  97.         errno = oerrno;
  98.         continue;
  99.     }
  100.  
  101.     /* Connected -- now make sure we can post. */
  102.     if ((F = fdopen(i, "r")) == NULL) {
  103.         oerrno = errno;
  104.         (void)close(i);
  105.         errno = oerrno;
  106.         continue;
  107.     }
  108.     if (fgets(buff, sizeof mybuff, F) == NULL) {
  109.         oerrno = errno;
  110.         (void)fclose(F);
  111.         errno = oerrno;
  112.         continue;
  113.     }
  114.     j = atoi(buff);
  115.     if (j != NNTP_POSTOK_VAL && j != NNTP_NOPOSTOK_VAL) {
  116.         (void)fclose(F);
  117.         /* This seems like a reasonable error code to use... */
  118.         errno = EPERM;
  119.         break;
  120.     }
  121.  
  122.     *FromServerp = F;
  123.     if ((*ToServerp = fdopen(dup(i), "w")) == NULL) {
  124.         oerrno = errno;
  125.         (void)fclose(F);
  126.         errno = oerrno;
  127.         continue;
  128.     }
  129.     return 0;
  130.     }
  131.  
  132.     return -1;
  133. }
  134.  
  135.  
  136.  
  137. #if    defined(REM_INND)
  138.  
  139. int
  140. NNTPremoteopen(FromServerp, ToServerp, errbuff)
  141.     FILE        **FromServerp;
  142.     FILE        **ToServerp;
  143.     char        *errbuff;
  144. {
  145.     char        *p;
  146.  
  147.     if ((p = GetConfigValue(_CONF_SERVER)) == NULL) {
  148.     if (errbuff)
  149.         (void)strcpy(errbuff, "What server?");
  150.     return -1;
  151.     }
  152.     return NNTPconnect(p, FromServerp, ToServerp, errbuff);
  153. }
  154.  
  155. #endif    /* defined(REM_INND) */
  156.  
  157.  
  158.  
  159. #if    defined(REM_NNTP)
  160.  
  161.  
  162. /*
  163. **  Open a connection to an NNTP server using the "clientlib" routines in
  164. **  the NNTP distribution.  We also create stdio FILE's for talking over
  165. **  the connection (which is easy since clientlib has them as globals.)
  166. **  Return -1 on error.
  167. */
  168. int
  169. NNTPremoteopen(FromServerp, ToServerp, buff)
  170.     FILE        **FromServerp;
  171.     FILE        **ToServerp;
  172.     char        *buff;
  173. {
  174.     extern FILE        *ser_rd_fp;
  175.     extern FILE        *ser_wr_fp;
  176.     extern char        *getserverbyfile();
  177.     char        *p;
  178.     int            i;
  179.  
  180.     if (buff)
  181.     (void)strcpy(buff, "Text unavailable");
  182.     if ((p = getserverbyfile(_PATH_SERVER)) == NULL)
  183.     return -1;
  184.     if ((i = server_init(p)) < 0)
  185.     return -1;
  186.     if (i != NNTP_POSTOK_VAL && i != NNTP_NOPOSTOK_VAL) {
  187.     errno = EPERM;
  188.     return -1;
  189.     }
  190.     if (ser_rd_fp == NULL || ser_wr_fp == NULL)
  191.     return -1;
  192.  
  193.     *FromServerp = ser_rd_fp;
  194.     *ToServerp = ser_wr_fp;
  195.     return 0;
  196. }
  197. #endif    /* defined(REM_NNTP) */
  198.